package com.exceeddata.vcloud.common.tools;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.exceeddata.vcloud.common.exception.ServiceRunTimeException;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;

/**
 * 描述: 通用工具类
 * 创建人: 赵兴炎
 * 日期: 2022年9月5日
 */
public class StringTool {
	
	
	/**
	 * 描述: 当前时间
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月5日
	 */
	public static String getLocalNowTimeString() {
		return dateToString(new Date());
	}
	
	/**
	 * 描述: 获取主键
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月5日
	 */
	public static long getSnowflakeNextId() {
		return IdUtil.getSnowflakeNextId();
	}
	
	/**
	 * 描述: 字符串转LocalDateTime
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月5日
	 */
	public static LocalDateTime stringToLocalDateTime(String dateTime) {
		if(dateTime==null || dateTime.trim().length() == 0)return null;
		return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
	}
	
	/**
	 * 描述: LocalDateTime转date
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月5日
	 */
	public static Date localDateTimeToDate(LocalDateTime localDateTime) {
		return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
	}
	
	/**
	 * 描述: 日期转字符串
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月13日
	 */
	public static String dateToString(Date dateTime) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return simpleDateFormat.format(dateTime);
	}
	
	/**
	 * 描述: 字符串转日期
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月13日
	 */
	public static Date stringToDate(String dateTime) {
		Date dateTimeValue = null;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			dateTimeValue = simpleDateFormat.parse(dateTime);
		} catch (Exception exception) {
			String exceptionToString = StringTool.exceptionToString(exception);
			throw new ServiceRunTimeException("stringToDate error, ERROR INFO:"+exceptionToString);
		}
		return dateTimeValue;
	}
	
	/**
	 * 描述: 异常转字符串
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月5日
	 */
	public static String exceptionToString(Exception exception) {
		StringWriter sw = new StringWriter();
		try(PrintWriter pw = new PrintWriter(sw);){
			exception.printStackTrace(pw);
		}
		String errorInfo = sw.toString();
		return errorInfo;
    }
	
	/**
	 * 描述: 按照一定数量读取集合里面的值
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月5日
	 */
    public static <T> List<List<T>> splitList(List<T> resList, int count) {  
        if (resList == null || count < 1)  return null;
        List<List<T>> ret = new ArrayList<List<T>>();  
        int size = resList.size();  
        if (size <= count) {  
            // 数据量不足count指定的大小  
            ret.add(resList);  
        } else {  
            int pre = size / count;  
            int last = size % count;  
            // 前面pre个集合，每个大小都是count个元素  
            for (int i = 0; i < pre; i++) {  
                List<T> itemList = new ArrayList<T>();  
                for (int j = 0; j < count; j++) {  
                    itemList.add(resList.get(i * count + j));  
                }  
                ret.add(itemList);  
            }  
            // last的进行处理  
            if (last > 0) {  
                List<T> itemList = new ArrayList<T>();  
                for (int i = 0; i < last; i++) {  
                    itemList.add(resList.get(pre * count + i));  
                }  
                ret.add(itemList);  
            }  
        }  
        return ret;  
    }
    
	/**
	 * 描述: 16进制转10进制
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月13日
	 */
	public static Integer convert16To10(String value){
		Integer resultDataValue = 0;
		if(value.substring(0,2).equals("0x")){
			resultDataValue = Integer.parseInt(value.substring(2),16); 
		}else {
			resultDataValue = Integer.parseInt(value,16);
		}
		return resultDataValue;
	}
	
	/**
	 * 描述: 日期转字符串
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月13日
	 */
	public static String longToStringSSS(long dateTime) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		return simpleDateFormat.format(new Date(dateTime));
	}
	
	/**
	 * 描述: MD5加密
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月13日
	 */
	public static String md5Hex(String strValue) {
		return SecureUtil.md5(strValue);
	}
	
	/**
	 * 描述: 获取几天前的日期
	 * 创建人: 赵兴炎
	 * 日期: 2022年9月13日
	 */
	public static List<String> beforeDay(int timeDay) {
		List<String> timeDayList = new ArrayList<>();
		LocalDate today = LocalDate.now();
		for (int i = timeDay-1; i >= 0; i--) {
			timeDayList.add(today.minusDays(i).toString());
		}
		return timeDayList;
	}
	
	public static void main(String[] args) {
		List<String> beforeDay = beforeDay(3);
		System.out.println(JacksonUtil.ObjectToJson(beforeDay));
	}

}
